<?php
/**
 * Created by PhpStorm.
 * @User: 王崇全
 * @Date: 2018/11/1 11:56
 */

namespace com;

use PHPMailer\PHPMailer\PHPMailer;


class Mail
{

    protected const HOST      = "smtp.qq.com"; //邮箱的服务器地址
    protected const PORT      = 465; //服务器端口号
    protected const IS_SSL    = true; //是否使用ssl加密方式登录鉴权
    protected const USER_NAME = "3001350190@qq.com"; // smtp登录的账号
    protected const PWD       = 'tjwlvyqnrrauddbd'; // smtp登录的密码
    protected const FROM      = '3001350190@qq.com'; // 发件人邮箱地址
    protected const FROM_NAME = "融美_王崇全"; // 发件人昵称

    /**
     * 发送邮件
     * @author 王崇全
     * @date   2018/11/1 12:12
     * @param string|array $to         收件人,可以批量
     * @param string       $title      邮件标题
     * @param string       $content    邮件正文,支持HTML
     * @param string|array $attachment 附件文件完整路径,支持多个
     * @return bool
     * @throws
     */
    public static function send($to, string $title, string $content = "", $attachment = null)
    {
        if ($content === "") {
            $content = $title;
        }

        //引入PHPMailer的核心文件 使用require_once包含避免出现PHPMailer类重复定义的警告
        //require_once("phpmailer/class.phpmailer.php");
        //require_once("phpmailer/class.smtp.php");
        //实例化PHPMailer核心类
        $mail = new PHPMailer();

        //是否启用smtp的debug进行调试 开发环境建议开启 生产环境注释掉即可 默认关闭debug调试模式
        //        $mail->SMTPDebug = config("app.app_debug") ? 1 : 0;
        $mail->SMTPDebug = 0;

        //使用smtp鉴权方式发送邮件
        $mail->isSMTP();

        //smtp需要鉴权 这个必须是true
        $mail->SMTPAuth = true;

        //链接qq域名邮箱的服务器地址
        $mail->Host = self::HOST;

        //设置使用ssl加密方式登录鉴权
        if (self::IS_SSL) {
            $mail->SMTPSecure = 'ssl';
        }

        //设置ssl连接smtp服务器的远程服务器端口号，以前的默认是25，但是现在新的好像已经不可用了 可选465或587
        $mail->Port = self::PORT;

        //设置smtp的helo消息头 这个可有可无 内容任意
        // $mail->Helo = 'Hello smtp.qq.com Server';

        //设置发件人的主机域 可有可无 默认为localhost 内容任意，建议使用你的域名
        //$mail->Hostname = 'http://www.lsgogroup.com';

        //设置发送的邮件的编码 可选GB2312 我喜欢utf-8 据说utf8在某些客户端收信下会乱码
        $mail->CharSet = 'UTF-8';

        //设置发件人姓名（昵称） 任意内容，显示在收件人邮件的发件人邮箱地址前的发件人姓名
        $mail->FromName = self::FROM_NAME;

        //smtp登录的账号 这里填入字符串格式的qq号即可
        $mail->Username = self::USER_NAME;

        //smtp登录的密码 使用生成的授权码（就刚才叫你保存的最新的授权码）
        $mail->Password = self::PWD;

        //设置发件人邮箱地址 这里填入上述提到的“发件人邮箱”
        $mail->From = self::FROM;

        //邮件正文是否为html编码 注意此处是一个方法 不再是属性 true或false
        $mail->isHTML(true);

        //设置收件人邮箱地址 该方法有两个参数 第一个参数为收件人邮箱地址 第二参数为给该地址设置的昵称 不同的邮箱系统会自动进行处理变动 这里第二个参数的意义不大
        if (is_array($to)) {
            foreach ($to as $v) {
                $mail->addAddress($v);
            }
        } else {
            $mail->addAddress($to);
        }

        //添加该邮件的主题
        $mail->Subject = $title;

        //添加邮件正文 上方将isHTML设置成了true，则可以是完整的html字符串 如：使用file_get_contents函数读取本地的html文件
        $mail->Body = $content;

        //为该邮件添加附件 该方法也有两个参数 第一个参数为附件存放的目录（相对目录、或绝对目录均可） 第二参数为在邮件附件中该附件的名称
        if (is_array($attachment)) {
            foreach ($attachment as $v) {
                $mail->addAttachment($v);
            }
        } elseif (is_string($attachment)) {
            $mail->addAttachment($attachment);
        }

        $status = $mail->send();

        if (!$status) {
            throw new \Exception("邮件发送失败:".$mail->ErrorInfo);
        }

        return $status;
    }
}